perm filename ARITH.PAL[HAL,HE]1 blob sn#121321 filedate 1974-09-24 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	SQRTF:	Floating point square root.  Timing:  126 -- 135 microseconds.
C00004 ENDMK
C⊗;
SQRTF:	;Floating point square root.  Timing:  126 -- 135 microseconds.
	;AC0 ← SQRT(AC0).  Clobbers AC1, AC2.
	;AC0:	argument
	;AC1:	guess of answer
	;AC2:	temp arith register
	ABSF AC0	;AC0 ← absolute value
	STEXP AC0,R0	;R0 ← Exponent
	INC R0		;
	ASR R0		;R0 ← (Exponent +1)/ 2
	BCS SQR1	;If fraction ≥ half then branch.
	LDF #00234,AC1	;FRACTION[guess] ← .470 = sqrt(3/2)
	BR SQR2		;
SQR1:	LDF #00335,AC1	;FRACTION[guess] ← .673 = sqrt(3)
SQR2:	LDEXP R0,AC1	;EXP[Guess] ← exponent / 2
	MOV #3,R0	;R0 ← Number of Newton iterations
SQR3:	LDF AC0,AC2	;temp ← arg
	DIVF AC1,AC2	;temp ← arg /guess
	ADDF AC1,AC2	;temp ← (arg/guess)+guess
	DIVF #40400,AC2	;temp ← ((arg/guess)+guess) / 2
	STF AC2,AC1	;new guess ← temp
	SOB R0,SQR3	;Repeat iteration a few times
	LDF AC1,AC0	;AC0 ← answer
	RTS PC		;Done